package BaseDeDatos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import util.GenerarAleatorios;
import util.GenerarCoordenadasAleatorias;
import util.Time;
import ClasesBasicas.Medicion;
import ClasesBasicas.Sensor;

public class ConsultasMedicion {

	public static List<Medicion> getMediciones(String Id_Sensor) {
		List<Medicion> mediciones = new ArrayList<Medicion>();
		Medicion actual = new Medicion();
		Connection conn;
		PreparedStatement ps;
		String url;
		ResultSet rs;
		try {
			Class.forName("org.sqlite.JDBC");
			url = "jdbc:sqlite:Funcionalidad.db";
			conn = DriverManager.getConnection(url, "", "");
			ps = conn
					.prepareStatement("select * from Medicion where Id_Sensor = ? ;");
			ps.setString(1, Id_Sensor);
			rs = ps.executeQuery();
			while (rs.next()) {
				actual = new Medicion();
				actual.setId_medicion(rs.getString("Id_Medicion"));
				actual.setFecha(rs.getString("Fecha"));
				actual.setHora(rs.getString("Hora"));
				actual.setLatitud(rs.getString("Latitud"));
				actual.setLongitud(rs.getString("Longitud"));
				actual.setValor(rs.getString("Valor"));
				actual.setId_Sensor(rs.getString("Id_Sensor"));
				mediciones.add(actual);
			}
			ps.close();
			rs.close();
			conn.close();
			return mediciones;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error en la consulta getMediciones()");
			return new ArrayList<Medicion>();
		}
	}

	public static List<Medicion> getMediciones() {
		List<Medicion> mediciones = new ArrayList<Medicion>();
		Medicion actual = new Medicion();
		Connection conn;
		PreparedStatement ps;
		String url;
		ResultSet rs;
		try {
			Class.forName("org.sqlite.JDBC");
			url = "jdbc:sqlite:Funcionalidad.db";
			conn = DriverManager.getConnection(url, "", "");
			ps = conn.prepareStatement("select * from Medicion ;");

			rs = ps.executeQuery();
			while (rs.next()) {
				actual = new Medicion();
				actual.setId_medicion(rs.getString("Id_Medicion"));
				actual.setFecha(rs.getString("Fecha"));
				actual.setHora(rs.getString("Hora"));
				actual.setLatitud(rs.getString("Latitud"));
				actual.setLongitud(rs.getString("Longitud"));
				actual.setValor(rs.getString("Valor"));
				actual.setId_Sensor(rs.getString("Id_Sensor"));
				mediciones.add(actual);
			}
			rs.close();
			ps.close();
			conn.close();
			return mediciones;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error en la consulta getMediciones()");
			return new ArrayList<Medicion>();
		}
	}

	public static Medicion getMedicion(String Id_Medicion) {
		Connection conn;
		PreparedStatement ps;
		String url;
		ResultSet rs;
		try {
			Class.forName("org.sqlite.JDBC");
			url = "jdbc:sqlite:Funcionalidad.db";
			conn = DriverManager.getConnection(url, "", "");
			ps = conn
					.prepareStatement("Select * from Medicion where Id_Medicion = ? ;");
			ps.setString(1, Id_Medicion);
			rs = ps.executeQuery();
			Medicion medicion = new Medicion();
			while (rs.next()) {
				medicion.setId_medicion(rs.getString("Id_Medicion"));
				medicion.setFecha(rs.getString("Fecha"));
				medicion.setHora(rs.getString("Hora"));
				medicion.setLatitud(rs.getString("Latitud"));
				medicion.setLongitud(rs.getString("Longitud"));
				medicion.setValor(rs.getString("Valor"));
				medicion.setId_Sensor(rs.getString("Id_Sensor"));

			}
			ps.close();
			conn.close();
			return medicion;

		} catch (Exception e) {
			System.out.println("Error al obtener la medicion del sensor "
					+ Id_Medicion);
			return new Medicion();
		}
	}

	public static Medicion getMedicionActual(String Id_Sensor) {
		Sensor actual = ConsultasSensor.getSensor(Id_Sensor);
		Medicion medicion = generarMedicion(actual);
		insertarMedicion(medicion, actual);
		return medicion;

	}

	public static void insertarMedicion(Medicion medicion, Sensor sensor) {
		Connection conn;
		PreparedStatement ps;
		String url;
		ResultSet rs;
		try {
			Class.forName("org.sqlite.JDBC");
			url = "jdbc:sqlite:Funcionalidad.db";
			conn = DriverManager.getConnection(url, "", "");
			ps = conn
					.prepareStatement("insert into Medicion values (?, ?, ?, ?, ?, ?, ?);");
			ps.setString(1, medicion.getId_medicion());
			ps.setString(2, medicion.getFecha());
			ps.setString(3, medicion.getHora());
			ps.setString(4, medicion.getLatitud());
			ps.setString(5, medicion.getLongitud());
			ps.setString(6, medicion.getValor());
			ps.setString(7, sensor.getId_sensor());
			ps.addBatch();
			ps.executeBatch();
			ps.close();
			conn.close();
		} catch (Exception e) {
			System.out.println("Error al insertar la medicion actual");
		}
	}

	public static Medicion generarMedicion(Sensor sensor) {
		Medicion nueva = new Medicion();
		nueva.setFecha(Time.getFechaActual());
		nueva.setHora(Time.getHoraActual());
		nueva.setId_medicion(generarId());
		nueva.setId_Sensor(sensor.getId_sensor());
		nueva.setLatitud(GenerarCoordenadasAleatorias.generar());
		nueva.setLongitud(GenerarCoordenadasAleatorias.generar());
		if (sensor.getDescripcion().equals("Sensor GPS")) {
			nueva.setValor(0 + "");
		} else if (sensor.getDescripcion().equals("Sensor Pulsaciones")) {
			nueva.setValor(GenerarAleatorios.generar(60, 160) + "pulsaciones");
		} else if (sensor.getDescripcion().equals("Sensor Humedad")) {
			nueva.setValor(GenerarAleatorios.generar(0, 100) + "%");
		} else if (sensor.getDescripcion().equals("Sensor Temperatura")) {
			nueva.setValor(GenerarAleatorios.generar(0, 45) + "Grados");
		} else if (sensor.getDescripcion().equals("Sensor Saturacion")) {
			nueva.setValor(GenerarAleatorios.generar(0, 100) + "%");
		} else if (sensor.getDescripcion().equals("Sensor Tension")) {
			nueva.setValor(GenerarAleatorios.generar(0, 20) + "/"
					+ GenerarAleatorios.generar(0, 20));
		} else {
			nueva.setValor(GenerarAleatorios.generar(0, 100) + "");
		}
		return nueva;
	}

	public static Medicion generarMedicion(Sensor sensor, String Latitud,
			String Longitud) {
		Medicion nueva = new Medicion();
		nueva.setFecha(Time.getFechaActual());
		nueva.setHora(Time.getHoraActual());
		nueva.setId_medicion(generarId());
		nueva.setId_Sensor(sensor.getId_sensor());
		nueva.setLatitud(Latitud);
		nueva.setLongitud(Longitud);
		if (sensor.getDescripcion().equals("Sensor GPS")) {
			nueva.setValor(0 + "");
		} else if (sensor.getDescripcion().equals("Sensor Pulsaciones")) {
			nueva.setValor(GenerarAleatorios.generar(60, 160) + "pulsaciones");
		} else if (sensor.getDescripcion().equals("Sensor Humedad")) {
			nueva.setValor(GenerarAleatorios.generar(0, 100) + "%");
		} else if (sensor.getDescripcion().equals("Sensor Temperatura")) {
			nueva.setValor(GenerarAleatorios.generar(0, 45) + "Grados");
		} else if (sensor.getDescripcion().equals("Sensor Saturacion")) {
			nueva.setValor(GenerarAleatorios.generar(0, 100) + "%");
		} else if (sensor.getDescripcion().equals("Sensor Tension")) {
			nueva.setValor(GenerarAleatorios.generar(0, 20) + "/"
					+ GenerarAleatorios.generar(0, 20));
		} else {
			nueva.setValor(GenerarAleatorios.generar(0, 100) + "");
		}
		return nueva;
	}

	public static String generarId() {
		List<Medicion> mediciones = getMediciones();
		boolean valido;
		String id = "";
		do {
			char letra = (char) GenerarAleatorios.generar(65, 91);
			System.out.println("char: " + letra);
			int numero = GenerarAleatorios.generar(0, 100);
			System.out.println("numero: " + numero);
			id = (char) letra + "" + numero + "";
			valido = true;
			for (int i = 0; i < mediciones.size(); i++) {
				if (id.equals(mediciones.get(i).getId_medicion())) {
					valido = false;
				}
			}

		} while (valido = false);
		return id;
	}

	public static void main(String[] args) {
		List<Medicion> mediciones = ConsultasMedicion.getMediciones();
		System.out.println(mediciones.size());
		System.out.println(ConsultasMedicion.getMedicion("M072").getLongitud());
		System.out.println(generarId());
		insertarMedicion(generarMedicion(ConsultasSensor.getSensor("S151")),
				ConsultasSensor.getSensor("S151"));
		System.out.println("Insertada nueva medicion");
		mediciones = ConsultasMedicion.getMediciones();
		System.out.println(mediciones.size());
		for (int i = 0; i < mediciones.size(); i++) {
			System.out.println(mediciones.get(i).getId_medicion());
		}
		System.out.println("Numero de usuarios conectados....");

	}
}
